iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0

let、const

Var 會全域宣告,所以很容易汙染作用域,ES6 改變變數型態宣告方式,從單純的 var 增加為 let、const ,都是用來宣告區塊裡的變數,區塊 = {}

  • 不會向上提升
  • 同個區塊不能重複命名
  • 不會繼承到 window 全域變數

let (變量、塊級變數、塊級作用域關鍵字)

  • 特性一: 未宣告不能使用
    var 會有變數提升的特性( 變數可以在宣告前使用,值為 undefined ), let 在宣告之前不能使用。
console.log(a); // undefined
var a = 1; 
console.log(b); // 錯誤:b is not defined
let b = 2;
  • 特性二: 塊級作用域

ES5 只提供「 全局作用域 」跟「 函式作用域 」,要嘛就是危險的暴露在全域、要嘛就是用 function 包起來,所以 let 跟 const 提供了更多的選擇。
let、const 的作用域是在大括號 { } 裡面,稱為「 塊級作用域 」。 大大降低了污染到其他變數的可能性。

var a = 0;
function changeA(){
    let a = 1;
    console.log(a);
}
changeA();
console.log(a);

//輸出
1 //函式裡的數字先出來,已經在區塊裡用 let指定a=1,在函式console(a)出來就是1
0 //就換函式裡的a=1,在函式外頭的console(a)還是最早先var a = 0,沒有汙染到全域變數。

const (定量、常數、唯讀變數)

單純的唯獨,不能去做修改,變數是不能被變更、只能讀取的時候,我們稱為常數,常見的有圓周率、URL網址、預設的值不想被變更時等等。
但是不能變更是指記憶體位置,在 object{}、array[]裡還是可以變動修改

const obj = {
    url: 'http://abc.com'
}
obj.url = 'x'
console.log(obj.url)

//輸出結果
x //物件中的 url 值被變更成 X 了

如果要讓const在物件中也不能更改的話,就是用 freeze() 凍結,就能讓物件凍結無法更改

const obj = {
  url: 'http://abc.com'
}
Object.freeze(obj)
obj.url = 'B'
console.log(obj.url)

//輸出結果
http://abc.com 內容不變,因為已經用freeze()凍結了

實際應用

let

for (var i= 0; i< 10; i++) {
    setTimeout(function() {
        console.log('這執行第' + i + '次');
    },10);
}
console.log(i)
// 輸出結果: 10 這執行第10次 

如果使用 var 應用 for 迴圈裡,var 是全域宣告變數,因此會等 i 都跑完結果,出現 10,
而 setTimeout 是非同步,會等到結果再執行 setTimeout,所以等 i 跑完到 10 結束之後,
把10套用到 setTimeout ,因此就只跑一次。
想要依序跑出來,就要改用 let

for (let i= 0; i< 10; i++) {
    setTimeout(function() {
        console.log('這執行第' + i + '次');
    },0);
}
// console.log(i)  // 無法再全域呼叫 i ,否則會報錯
// 輸出結果: 這執行第0次 ..... 這執行第9次 
// 就會依序執行

const

const personA = {
    name:'小明',
    home:'小明家',
    money: 500
}
person.name = '花道';
person.home = '花道家';
person.money = 1000;
person;
// person = {} // 如果賦予其他物件上,就會報錯
// 輸出結果: {name: "花道", money: 500}

const 無法改變的是物件本身,但是還是可以對物件的屬性為字串值做改變,因為物件傳參考的特性,但是數值無法更動。


上一篇
7. 最常見的 this - 物件的方法調用
下一篇
09. ES6-箭頭函數
系列文
JS 作品實戰應用 - Vue 電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言